//=====================================================================
//
//
//
//=====================================================================
#ifndef KALEIDOSCOPE_RESOLVER_HPP
#define KALEIDOSCOPE_RESOLVER_HPP
//=====================================================================
#include <sooty/frontend/syntactic_analysis/parseme.hpp>
#include <sooty/frontend/semantic_analysis/symbol_table.hpp>
//=====================================================================
#include <kaleidoscope/kaleidoscope.hpp>
//=====================================================================
KALEIDOSCOPE_BEGIN
//=====================================================================
	
	class resolver
	{
		atma::sooty::symbol_table* value_table_;
		atma::sooty::symbol_table* type_table_;
		
		atma::sooty::symbol_table& value_table() { return *value_table_; }
		atma::sooty::symbol_table& type_table() { return *type_table_; }
		
	public:
		resolver(atma::sooty::symbol_table& value_table, atma::sooty::symbol_table& type_table);
		
		// - expects a function_call node
		// - returns a nullary if there weren't any close enough
		atma::sooty::parseme_ptr find_closest_matching_function(atma::sooty::const_parseme_ptr_ref);
		
		// - returns the type-id of an argument (ie: int, real, bool...)
		// - returns identifier if it's a UDT - you'll have to do more deduction :P
		size_t argument_type(atma::sooty::const_parseme_ptr_ref);
		
		// - expects an value (ie, variable instance)
		// - NOT for types (ie... types)
		// - returns the declaration of that variable
		atma::sooty::parseme_ptr value(atma::sooty::const_parseme_ptr_ref);
		
		
		//bool types_are_
	private:
		atma::sooty::parseme_ptr find_value_in_scope(atma::sooty::const_parseme_ptr_ref);
		
	};
	
	
	namespace resolve
	{
		//bool function_call(atma::sooty::const_parseme_ptr_ref call, atma::sooty::const_parseme_ptr_ref candidate)
		//{
		//	
		//}
	}
	
	
//=====================================================================
KALEIDOSCOPE_CLOSE
//=====================================================================
#endif
//=====================================================================
